package com.ylxin.webflux.handler;

import com.ylxin.webflux.pojo.User;
import com.ylxin.webflux.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import javax.print.attribute.standard.Media;
import javax.xml.ws.Service;
import java.util.List;

/**
 * @author 29048
 * @version V1.0
 * @Project webflux01
 * @Package com.ylxin.webflux.handler
 * @Description: Create by 杨立新 @Date 2022/9/22 17:19
 */

/**
 * Controller：让Web返回自己去获取数据
 */
@RestController
public class TestController {

    //Service 会返回数据
    private UserService userService;

    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    @GetMapping("/user/info/{id}")
    public Mono<User> findById(@PathVariable int id) {
        return userService.getUserById(id);
    }

    //通过mono的方式返回数据
    @GetMapping("/users")
    public Flux<User> findAllUsers() {
        return userService.getAllUser();
    }

    /**
     * 查询所有，通过flux流的方式【一条一条】返回。
     * produces 可以设置响应结果的类型，之前是MediaType.APPLICATION_JSON之前只是不写而已
     * 这次produces是换成 TEXT_EVENT_STREAM_VALUE事件类型的处理结果
     *
     * @return
     */
//    @GetMapping(value = "/users/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
//    public Flux<User> getUsersStream(){
//        return userService.getAllUser();
//    }
    @GetMapping(value = "/users/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<User> getUsersStream() {
        return userService.getUsersStream();
    }


    /**
     * 和以前的区别：返回值 套了一层Mono<Void>，除此之外没有任何区别。
     *
     * @param user
     * @return
     */
//    @PostMapping("/user")
//    public Mono<Void> saveUserInfo(@RequestBody User user){
//        return userService.saveUserInfo(Mono.just(user));  //方法用User原始数据来接收，到时候一下Mono用一下就可以
//    }
    @PostMapping("/user")
    public Mono<Void> addUser(@RequestBody Mono<User> user) {
        return userService.saveUserInfo(user);  //saveUserInfo 用Mono来接收数据，用的时候直接用就可以。
    }


    //全国换成原始的操作。
    //现在所有的Service方法没有和 Flux相关的东西。所有的Flux都在Controller里面。
    //Controller这边到底是用Mono还是Flux 和Service无关，Service 可以只给我数据，我自己把它组合成我想要的结果。
    //所有的操作都是使用了昨天学习的操作符，只不过数据到底怎么得到，最关键就是之前操作符中的数据是怎么得到它。
    //要想学会 WebFlux 很简单，只需要把 Mono和Flux操作符熟练了，那么 WebFlux 里面的所有东西就几乎没有任何问题。
   @GetMapping("/user/info1/{id}")
    public Mono<User> findById2(@PathVariable int id) {
       User user = userService.getUserById2(id);
       return Mono.just(user);
   }

    //通过mono的方式返回数据
    @GetMapping("/users1")
    public Flux<User> findAllUsers2() {
        //现在所有的Service方法没有和 Flux相关的东西。所有的Flux都在Controller里面。
        List<User> userList = userService.getAllUser2();
        return Flux.fromIterable(userList);
    }

    @PostMapping("/user1")
    public Mono<Void> addUser2(@RequestBody User user) {
        userService.saveUserInfo2(user);  //saveUserInfo 用Mono来接收数据，用的时候直接用就可以。
        return Mono.empty();
    }

}
